# !/usr/bin/python
# -*- coding: utf-8 -*-
'''
@File    :   674_最长连续递增序列.py
@Time    :   2021/11/05 09:56:04
@Author  :   Qingxiang Zhang
@Version :   1.0
@Contact :   344285081@qq.com
@Desc    :   动态规划
@Software:    Vscode
'''
"""
难度： 简单
给定一个未经排序的整数数组，找到最长且连续递增的子序列，并返回该序列的长度。
连续递增的子序列 可以由两个下标 l 和 r（l < r）确定，如果对于每个 l <= i < r，都有 nums[i] < nums[i + 1] ，那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。
示例 1：
输入：nums = [1,3,5,4,7]
输出：3
解释：最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的，因为 5 和 7 在原数组里被 4 隔开。 
示例 2：
输入：nums = [2,2,2,2,2]
输出：1
解释：最长连续递增序列是 [2], 长度为1。
提示：
1 <= nums.length <= 104
-109 <= nums[i] <= 109
 """
""" #### 解题思路
这道题是不是一眼看过去和上题非常的像，没错了，这个题目最大的不同就是**连续**两个字，这样就让这个问题简单很多了，因为如果要求连续的话，那么就不需要和上题一样遍历两遍数组，只需要比较前后的值是不是符合递增的关系。
- **第一步：确定动态规划状态**
  对于这个问题，我们的状态**dp[i]也是以nums[i]这个数结尾的最长递增子序列的长度**
- **第二步：写出状态转移方程**
  这个问题，我们需要分两种情况考虑，第一种情况是如果遍历到的数`nums[i]`后面一个数不是比他大或者前一个数不是比他小，也就是所谓的不是连续的递增，那么这个数列最长连续递增序列就是他本身，也就是长度为1。
  第二种情况就是如果满足有递增序列，就意味着当前状态只和前一个状态有关，`dp[i]`只需要在前一个状态基础上加一就能得到当前最长连续递增序列的长度。总结起来，状态的转移方程可以写成
  ` dp[i]=dp[i-1]+1`
- **第三步：考虑初始化条件**
  和上面最长子序列相似，这个题目的初始化状态就是一个一维的全为1的数组。
- **第四步：考虑输出状态**
  与上题相似，这个问题输出条件也是求dp数组中最大的数。
- **第五步：考虑是否可以优化**
  这个题目只需要一次遍历就能求出连续的序列，所以在时间上已经没有可以优化的余地了，空间上来看的话也是一维数组，并没有优化余地。
综上所述，可以很容易得到最后的代码"""

class Solution:
    def findLengthOfLCIS(self, nums) -> int:
        if not nums:
            #判断边界条件
            return 0
         #初始化dp数组状态
        dp = [1] * len(nums)
         #注意需要得到前一个数，所以从1开始遍历，否则会超出范围
        for i in range(1,len(nums)):
            if nums[i] > nums[i-1]:
                dp[i] = dp[i-1]+1
            else:
                # [1,3,5,4,7]
                # [1,2,3,1,1]
                # [0,1,0,0,0]
                dp[i] = 1
        return max(dp)
        # 确定输出状态
